home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PC World 2000 February
/
PCWorld_2000-02_cd.bin
/
Software
/
Servis
/
FFE
/
COMM.SWG
/
0010_Hudson Format (GERMAN!).pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
1997-05-11
|
13KB
|
392 lines
The little programers guide to the hudsonbase
---------------------=*=---------------------
Was Sie schon immer über die
Strukturen der Hudson-Messagebase
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
wissen wollten -
bisher aber nicht zu fragen wagten ...
-------------------------------------------------------------------------------
DIE DATEIEN
~~~~~~~~~~~
Die Messagebase besteht aus fünf Dateien, in denen alle Mails aller Areas
gespeichert werden (ausser den Mailer *.MSG's natürlich):
MSGINFO .BBS MSG-Anzahl in den Boards (höchste,niedrigste,gesamt)
MSGIDX .BBS Message Nr x gehört zu Board y
MSGHDR .BBS Anschriftenteil der MSG's (BY:XX, TO:XX, RE:XX, Flags ..)
MSGTXT .BBS Der eigentliche Text (ohne BY:, TO:, etc.)
MSGTOIDX.BBS Indexdatei für TO:xxx, enthält Namen bzw. *Received*
Die Messagebase arbeitet nicht mit den Namen der Echoboards, sondern
organisiert sich ausschließlich mit den Board-Nummern (1 - 200). Boardnamen
werden nur vom Tosser/Scanner verwendet - der damit die Zuordnung zu der vom
SysOp definierten Boardnummer aufbaut (zB: REQUEST.GER = Board# 100). Die
fünf Dateien enthalten also KEINE Boardnamen (ausser bei Fehlern :-).
VARIABLENAUFBAU
~~~~~~~~~~~~~~~
Folgende Variablenarten werden verwendet (Pascal-Strukturen):
1-Byte-Zeiger = Byte = ASCII 0 bis ASCII 255
2-Byte-Zeiger = Integer = LSB,MSB
String = PASCSTRG = [LängenByte]TEXT
DIE STRUKTUREN
~~~~~~~~~~~~~~
MSGINFO.BBS
===========
Randomdatei mit Satzlänge 2
Satzanzahl immer 203
Bedeutung: Enthält die Gesamtzahl der Messages und die Zahl in den
einzelnen Boards. Damit kann zB. ein MSG-Editor anzeigen
wieviele Nachrichten in einem Board liegen.
Satzaufbau:
InfoRecord = Record
LowMsg: Integer;
HighMsg: Integer;
TotalActive: Integer;
ActiveMsgs: Array[1..200] of Integer;
End;
Felder: Also, alles 2-Byte-Zeiger:
(Low)(High)(Total)(Area1)(Area2)(Area3)(Area...200)
2 2 2 2 2 2 ... = 406 Byte
Alle Zeigerwerte liegen zwischen 1 und 32768.
Low = Niedrigste Nr aller aktiven MSG's
High = Höchste Nr aller aktiven MSG's
Total = Anzahl aller aktiven MSG's
AreaX = Anzahl der aktiven MSG's in Area 1 - 200
(aktiv=ungelöscht=ohne Löschvermerk)
Hinweis: Manche Tosser verdoppeln diesen Dateiinhalt indem sie aus
Sicherheitsgründen die Gesamtstruktur zweimal hintereinander anlegen:
(Low)(High)(Total)(Area1)(Area2)(Area..200)(Low)(High)(Total)(Area1)...
^^^^^^^^^^^^^^^^^^^^^^^^...
Dann ist die MSGINFO.BBS = 812 Byte groß. Gültig sind aber nur die
ersten 406 Byte.
MSGIDX.BBS
==========
Randomdatei mit Satzlänge 3
Je Message existiert ein Satz.
Bedeutung: Hält für jede Message(-Nr) fest zu welchem Board sie
gehört. Damit findet ein Editor beim Weiterschalten die
jeweils nächste oder vorige Message in einem Board.
Satzaufbau:
IdxRecord = Record
MsgNum: Integer;
Board: Byte;
End;
Felder: Also 2-Byte-Zeiger plus 1-Byte-Zeiger:
(MSG-Nr) (Board)
2 1 = 3
MSG-Nr zwischen 1 und 32768
Board zwischen 1 und 200
MSGHDR.BBS
==========
Randomdatei mit Satzlänge 187
Je Message existiert ein Satz.
Bedeutung: Enthält den gesamten Message-Header, incl. aller Angaben
zu Sender, Empfänger, Nodeadressen, etc.
Ebenso einen Zeiger auf den eigentlichen Messagetext.
Satzaufbau:
Bytes
HdrRecord = Record
MsgNum, Integer 2
ReplyTo, Integer 2
SeeAlsoNum, Integer 2
TimesRead: Integer { Not used } 2
StartRec: Word 4
NumRecs, Integer 2
DestNet, Integer 2
DestNode, Integer 2
OrigNet, Integer 2
OrigNode: Integer 2
DestZone, Byte 1
OrigZone: Byte 1
Cost: Integer 2
MsgAttr, Byte 1
NetAttr, Byte 1
Board: Byte 1
PostTime: String[5] 6
PostDate: String[8] 9
WhoTo, String[35] 36
WhoFrom: String[35] 36
Subj: String[72] 72
End;
Felder: Alle Strings sind in der Form "[Längenbyte]Text" aufgebaut.
MsgNum - Fortlaufende Nummer 1 - 32768
ReplyTo - Rück-Verweis (Verkettung zurück) auf
Msg Nr xx oder 0
SeeAlsoNum - Vor-Verweis (Verkettung vorwärts) auf
Msg Nr xx oder 0
StartRec - ist als WORD aufgebaut und enthält die
Blocknummer bei der der Messagetext in
der MSGTXT.BBS beginnt.
NumRecs - Anzahl der Blöcke die die Message in der
MSGTXT.BBS belegt.
DestNet/
Node/Zone - Bei Netmails Ziel-Zone, -Node und -Netz
OrgNet/
Node/Zone - Bei Netmails Origin-Zone, -Node und Netz
Cost - Kostenkennung der Mail
MsgAttr - Msg Attributes:
Bit 0: Deleted
Bit 1: Unsent net mail message
Bit 2: Net mail message
Bit 3: Private message
Bit 4: Received
Bit 5: Unsent echomail message
Bit 6: Local message
Bit 7: Not used
NetAttr - Net Attributes:
Bit 0: Kill after sent
Bit 1: Sent OK
Bit 2: File attach
Bit 3: Crash mail
Bit 4: Request Receipt
Bit 5: Audit Request
Bit 6: Is a Return Receipt
Bit 7: Not used
Dieses Byte wird nur bei Netmails verwendet.
Board - Boardnummer, Board zu dem die Msg gehört
PostTime - Uhrzeit der Msg, in der Stringform:
12:45 Uhr => (ASCII_5)12:45
PostDate - Datum der Msg, als Monat-Tag-Jahr:
24.06.92 => (ASCII_8)06-24-92
WhoTo - Empfängername in Stringform
WhoFrom - Ansendername in Stringform
Subj - Betreff in Stringform
MSGTXT.BBS
==========
Bedeutung: Enthält den Messagetext - und NUR den Text.
Satzaufbau: Messagetext in 256-Byte-Blöcken:
Byte 1 = Blocklänge (1 bis 255)
Byte 2 - 256 = Text
Ein Text der zB. 300 Byte lang ist, wird dann so gespeichert:
Block 1 (ASCII_255) + die ersten 255 Byte Text
Block 2 (ASCII_45) + die restlichen 45 Byte Text
Der Rest des 2.Blocks bleibt leer.
Block 3 (LängenByte ... der nächsten Nachricht ...
Für jede Message existieren also unterschiedlich viele
Blöcke.
Hinweis: Das gelegentlich _IM_ Text vorkommende ASCII 141 »ì« dient
als Soft-Return und hat sonst keine Bedeutung.
MSGTOIDX.BBS
============
Randomdatei mit Satzlänge 36 Byte.
Für jede Message existiert ein Satz.
Bedeutung: Lesemerker für die User. Ein Editor oder BBS ermittelt
hiermit, welche ungelesenen Mails an den jeweiligen User
noch vorhanden sind.
Satzaufbau:
ToIndex = Record
WhoTo: String[35]
End;
Felder: Also: Byte 1 = Textlänge
Byte 2 - 36 = Name des Message-Empfängers
Wurde die Mail vom User gelesen, dann steht anschließend in
Byte 2-36 nicht mehr der Username, sondern "* Received *"
Beispiel: Empfänger heißt "Hans Huber" = 10 Zeichen
(ASCII_10)Hans Huber
nach dem Lesen:
(ASCII_12)* Received *
ZUSAMMENSPIEL
~~~~~~~~~~~~~
Die fünf Dateien hängen nach folgendem Schema von einander ab:
┌---> Empfängername als Kopie in MSGTOIDX.BBS
|
┌---> Header in MSGHDR.BBS
|
Message >--┼---> Text in MSGTXT.BBS
|
└---> BoardNr in MSGIDX.BBS
|
└---> Gesamtzahl und Anzahl/Board in MSGINFO.BBS
Die Ordnungsfolge der Datensätze folgender Dateien entspricht einander:
1. Satz in MSGHDR.BBS -
- gehört zu 1. Satz in MSGIDX.BBS -
- gehört zu 1. Satz in MSGTOIDX.BBS
(MSGTXT.BBS und MSGINFO.BBS sind logischerweise nicht so zuzuordnen.)
WIE LESE ICH NUN EINE MESSAGE AUS DER BASE?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Nehmen wir zB. Messagenummer 452
a) Satz 452 aus MSGHDR.BBS lesen,
BY:, TO:, RE:, etc extrahieren,
b) Feld -StartRec- auslesen,
Feld -NumRecs- auslesen
c) In der MSGTXT ab dem Block (StartRec) lesen,
undzwar (NumRecs) Blöcke lang.
Und schon haben wir die Mail!
MSGHDR.BBS MSGTXT.BBS
... ...
-StartRec- -NumRecs- (ASCII_60)textetxtetxtet.
╚═══════════╪═══════(ab hier)═════>┌ (ASCII_255)Texttxtetxtetxtextte
└────────(zB. 4)───────┼ (ASCII_255)textetxtetxtetxtetxt
├ (ASCII_255)textetxtetxtetxtetxt
└ (ASCII_50)textetxtet.
(ASCII_255)Textetxtetxtetxtetxt
...
Zeilenumbrüche sind entweder als Hardreturn ASCII_13 (CR) oder als
Softreturn ASCII_141 (ì) im Text enthalten:
( soll ASCII_13 darstellen)
"≡Hallo, das ist eine erste Zeileìund das die zweiteund hier die dritte..."
^ ^ ^
└─ Längenbyte └─ Zeilenumbrüche ─┘
-------------------------------------------------------------------------------
The little programers guide to the hudsonbase.
* Origin: Munich, 15.09.92
-Rainer-
(2:246/54)